package ru.nsu.fit.ws.get_questions_stat;

import ru.nsu.fit.shared.data_base_manager.DatabaseManager;
import ru.nsu.fit.shared.error_codes.ErrorCodes;
import ru.nsu.fit.shared.questions_stat_request.QuestionsStatGetterInputForDB;
import ru.nsu.fit.shared.questions_stat_request.QuestionsStatGetterOutputFromDB;

import javax.jws.HandlerChain;
import javax.jws.WebService;
import java.sql.SQLException;
import java.util.ArrayDeque;
import java.util.Queue;

import static ru.nsu.fit.shared.error_codes.ErrorCodes.*;

/**
 * Created by IntelliJ IDEA.
 * User: vtimofeev
 * Date: 12/23/12
 * Time: 8:27 PM
 * To change this template use File | Settings | File Templates.
 */
@WebService(endpointInterface = "ru.nsu.fit.ws.get_questions_stat.QuestionsStatGetter")
@HandlerChain(file= "handler-chain.xml")
public class QuestionsStatGetterImpl implements QuestionsStatGetter{
    @Override
    public QuestionsStatGetterOutput getQuestionsStat(QuestionsStatGetterInput input) {

        long userSessionId = input.getUserSessionId();
        int[] questionIds = input.getQuestionIds();

        if (questionIds == null) {
            System.out.println("QuestionIds = null");
            return createQuestionsStatGetterOutput(DATABASE_ERROR);
        }

        try {
            int userID = DatabaseManager.getUserId(userSessionId);
            if (userID < 0) {
                return createQuestionsStatGetterOutput(NOT_AUTHORIZED);
            }

            QuestionsStatGetterInputForDB inputForDB = new QuestionsStatGetterInputForDB(userID, questionIds);
            QuestionsStatGetterOutputFromDB outputFromDB = DatabaseManager.getQuestionsStat(inputForDB);

            return createQuestionsStatGetterOutput(outputFromDB);

        } catch (SQLException e) {
            e.printStackTrace();
            return createQuestionsStatGetterOutput(DATABASE_ERROR);
        }
    }

    //If error
    private QuestionsStatGetterOutput createQuestionsStatGetterOutput(ErrorCodes errorCode) {

        // All fields are zero(or null) initially
        QuestionsStatGetterOutput output = new QuestionsStatGetterOutput();

        output.setErrorCode(errorCode.getCode());
        output.setErrorMessage(errorCode.getMessage());

        return output;
    }

    //If no error
    private QuestionsStatGetterOutput createQuestionsStatGetterOutput
            (QuestionsStatGetterOutputFromDB outputFromDB) {
        QuestionsStatGetterOutput output = new QuestionsStatGetterOutput();

        output.setQuestionIds(outputFromDB.questionIds);
        output.setQuestionTexts(outputFromDB.questionTexts);
        output.setAnswerIds(outputFromDB.answerIds);
        output.setAnswers(outputFromDB.answers);
        output.setLifetimes(outputFromDB.lifetimes);
        output.setIncomes(outputFromDB.incomes);
        output.setDoesQuestionBelongToMe(outputFromDB.doesQuestionBelongToMe);
        output.setAnswerHits(outputFromDB.answerHits);

        ErrorCodes errorCode = NO_ERROR;
        output.setErrorCode(errorCode.getCode());
        output.setErrorMessage(errorCode.getMessage());

        return output;
    }
}
